package com.chen.cloudpicture.manager.websocket.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 图片编辑请求消息
 * <p>
 * 事件驱动架构设计：生产者发送消息到服务器（事件分发器），服务器收到事件后，再转发给其他用户（消费者）（由事件触发）
 * 需要有事件类型和具体操作。
 * 相比于生产者直接调用消费者，事件驱动模型的主要优点在于 解耦 和 异步性。生产者只需要将消息发送到事件分发器，
 * 消费者则根据事件类型处理逻辑。这样多个消费者可以独立响应同一事件，系统更加灵活，可扩展性更强。
 * 事件驱动还可以提升系统的 并发性 和 实时性，可以理解为多引入了一个中介来帮忙，通过异步消息传递，减少了阻塞和等待，能够更高效地处理多个并发任务。
 * eg:事件触发者: 用户 A 建立连接，加入编辑; 事件类型: INFO; 事件消费者: 显示“用户 A 加入编辑”的通知
 * <p>
 * 怎么解决并发协作冲突：最简单的方式可以通过加锁让同一时间只允许一个用户操作。这样协作؜编辑的交互流程又要增加 2 动作 —— 进入编辑状态和退出编辑状态：
 * 此外还有实时协同 OT 算法，通过操作，转化，因果一致性，确保编辑结果在所有用户终端一致。但是并发操作的位置越密集，算法设计难度就越大
 * （转化：根据规则将收到的信息排序和合并；因果一致性：每个用户的操作基于最新的内容状态同时符合用户的操作顺序逻辑）
 * 此外还有类似的协同算法 CRDT，去中心化，更适用于离线操作场景，更牛逼
 * <p>
 * WebSocket：全双工通信协议，连接的双方可以随时发送和接收数据，而不需要不断建立和关闭连接。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PictureEditRequestMessage {

    /**
     * 消息类型，例如 "ENTER_EDIT", "EXIT_EDIT", "EDIT_ACTION"
     */
    private String type;

    /**
     * 执行的编辑动作（如放大，缩小等）
     */
    private String editAction;
}
